package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.User;
import com.jt.service.DubboUserService;
import com.jt.service.HttpClientService;
import com.jt.util.CookieUtil;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
//消费者
@Controller
@RequestMapping("user")
public class UserController {
    //使用常量定义Cookie的名称
    private static final String JT_TICKET="JT_TICKET";
    @Autowired
    private HttpClientService httpClientService;
    //启动时是否检验有服务的提供者,设置为false则先启动生产者还是消费者都不会报错了
    @Reference(check = false) //表示为接口创建代理对象进行注入,通过rpc访问服务的生产者
    private DubboUserService userService;
    @Autowired
    private Jedis jedisCluster;


    /**实现登录和注册的页面跳转
     * http://www.jt.com/user/login.html
     * http://www.jt.com/user/register.html
     */
    @RequestMapping("/{moduleName}")
    public String moduleName(@PathVariable String moduleName){
        return moduleName;
    }

    /**
     * http://www.jt.com/user/findUserList
     * 要求返回Json格式的用户数据
     */
    @ResponseBody
    @RequestMapping("findUserList")
    public List<User> findUserList(){
        return httpClientService.findUserList();
    }

    /**
     * 完成用户注册操作
     * url: http://www.jt.com/user/doRegister
     * 参数:{
     *          username:xx
     *          password:xx
     *          phone:xx
     *      }
     * 返回值:sysResult对象
     */
    @RequestMapping("doRegister")
    @ResponseBody //将返回值的结果转化为json
    public SysResult saveUser(User user){//User在网络中传输,必须要实现序列化接口,User的父类已经实现了
        userService.saveUser(user);
        return SysResult.success();
    }

    /**
     * 实现用户的单点登录操作
     * url:http://www.jt.com/user/doLogin?r=0.5185000275221965
     * 参数:{
     *          username:admin123
     *          password:admin123456
     *      }
     * 返回值:SysResult
     * 流程:
     *      1.获取用户名密码校验
     *      2.实现cookie数据的存储,非空
     *      3.如果一切正常,则将数据存储到Cookie中.路径 有效期 共享
     * Cookie说明:
     *  1.Cookie只能看到自己域名下的,是私有的
     *  2.setPath说明
     *      setPath("/")表示读取Cookie权限的设定,一般都是"/"
     *      setPath("/user")表示请求url地址路径在/user下时才能获取Cookie信息
     */
    @RequestMapping("doLogin")
    @ResponseBody
    public SysResult userLogin(User user, HttpServletResponse response){
        String ticket = userService.findUserByUP(user);
        if (!StringUtils.hasLength(ticket)){
            //如果数据为null,则表示用户名密码错误
            return SysResult.fail();
        }
        //需要将数据保存到Cookie中
        Cookie cookie = new Cookie("JT_TICKET", ticket);
        cookie.setPath("/");
        cookie.setMaxAge(60*60*24*7);//设置七天有效期.单位是秒
        cookie.setDomain("jt.com");//设置共享,只要域名中有jt.com则可以共享数据
        response.addCookie(cookie);//响应Cookie到浏览器
        return SysResult.success();
    }

    /**
     * 完成用户退出操作
     * 1.重定向到系统首页
     * 2.删除redis中的数据 k-v 先获取key->要先从Cookie中获取ticket
     * 3.动态获取cookie的数据
     * url: ../user/logout
     */
    @RequestMapping("logout")
    public String logout(HttpServletRequest request,HttpServletResponse response){
        String ticket = CookieUtil.getCookieValue(request, JT_TICKET);
        if (StringUtils.hasLength(ticket)){
            //删除redis
            jedisCluster.del(ticket);
            //删除Cookie
            CookieUtil.addCookie(response,JT_TICKET,"", "/", "jt.com", 0);
        }
        return "redirect:/";

        //不使用工具API
        /*Cookie[] cookies = request.getCookies();
        if (cookies!=null && cookies.length>0){
            for (Cookie cookie:cookies){
                if (JT_TICKET.equals(cookie.getName())){
                    String ticket = cookie.getValue();
                    //删除redis的数据
                    jedisCluster.del(ticket);
                    //删除Cookie的数据->此处获取的Cookie是只有键值对的,没有剩余时间等其他信息,所以只设置超时时间浏览器会误判,不会删除,需要将Cookie的其他信息设置为一样的才会匹配
                    cookie.setPath("/");
                    cookie.setMaxAge(0);//0表示立即删除 -1表示浏览器关闭时删除
                    cookie.setDomain("jt.com");//设置共享,只要域名中有jt.com则可以共享数据
                }
            }
        }
        return "redirect:/";*/
    }
}
